实验指导中的代码直接插到这里来了
【前提引入】
1️⃣ 如果代码中含有中文并且是在windows的cmd命令行进行javac编译指令的执行,如果直接使用javac Tree.java
是会报错:不可映射的字符集编码。
Tree.java
是使用的unicode字符集的UTF-8编码,则存储方式(编码)就为UTF-8。javac Tree.java
是没有问题的,因为** Unicode字符集和GBK字符集是完全兼容 ASCII字符集的。**解决方案:
javac -encoding utf8 Tree.java
。(推荐)2️⃣ 对下面的代码显示的结果分析:
Tree.java 和 Bamboo.java 文件中都含有 Living 类,因此我们如果这样执行:
javac -encoding utf8 Tree.java
。这样就会在 package-interface文件夹中 生成 Tree.class 和 Living.class 两个字节码二进制文件。javac -encoding utf8 Bamboo.java
。这样就会生成在 package-interface文件夹中 Bamboo.class 和 Living.class 两个字节码二进制文件。【核心代码】
Tree.java
public class Tree
{
public static void main(String[] args){
Living tree=new Living ();
tree.say();
}
}
class Living
{
public void say(){
System.out.println("我是一棵树");
}
}
Bamboo.java
public class Bamboo
{
public static void main(String[] args)
{
Living bamboo =new Living ();
bamboo.say();
}
}
class Living
{
public void say()
{
System.out.println("我是一棵竹子");
}
}
【运行流程】
将Tree.java和Bamboo.java放与同一文件夹下。
编译Tree.java,运行Tree,观察提示结果。
编译Bammboo.java,运行Bammboo,观察提示结果。
运行Tree,观察提示结果
【前提引入】
1️⃣ 如果将两个Living类分别放在两个文件夹Tree和Bamboo中,这样在编译这两个 Living.java 的时候由于在不同文件下生成 Living.class 字节码二进制文件,肯定就不会造成命名冲突,也就不会造成覆盖问题。
谈一谈包
包的三大作用
基础语法
/*
声明包:package 关键字 打包名称
声明当前类所在的包
*/
package com.bamboo //声明当前类是在com包下的子包bamboo下
/*
引用包:import 关键字 打包名称
引用某个类
*/
import java.util.Scanner; //引用到 java包下 的 util包 中的 Scanner类文件
import java.net.* //引用java包下 的 net包 中的 所有类文件
本质
实际上就是创建不同的 文件夹/目录 来保存类文件
注意事项
【核心代码】
Tree文件夹下的Living.java
package Tree; //当前在Tree包中
public class Living
{
public void say()
{
System.out.println("我是一棵树");
}
}
Bamboo文件夹下的Living.java
package Bamboo; //声明当前在 Bamboo包下
public class Living
{
public void say()
{
System.out.println("我是一个小竹子");
}
}
package-interface文件夹下的Tree.java
import Tree.Living; //引用在Tree包下的Living类
public class Tree
{
public static void main(String[] args)
{
Living tree=new Living ();
tree.say();
}
}
package-interface文件夹下的Bambo.java
import Bamboo.Living; //找Bamboo包下的Living类
public class Bamboo
{
public static void main(String[] args)
{
Living bamboo=new Living ();
bamboo.say();
}
}
【运行流程】
将两个Living类分别放在两个文件夹Tree和Bamboo中,Tree.java和Bamboo.java放在根目录(文件夹Tree和Bamboo的上一级目录下)
编译Tree.java和Living.java,运行Tree,观察提示结果。
编译Bamboo.java和Living.java,运行Bamboo,观察提示结果。
再次运行Tree,查看结果。
【前提引入-接口简介】
基本介绍
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些这些方法写出来。
基本语法
interface 接口名{
//属性
//方法(抽象方法,默认实现方法,静态方法)
}
class 类名 implements 接口名{
//自己属性
//自己方法
//必须实现的抽象接口方法
}
注意事项
实现接口 vs 继承类
接口和继承解决的问题不同:
实现接口是 对 java单继承机制 的一种很好的补充。
接口比继承更灵活
继承是满足 is-a
关系,而接口只需要满足 like-a
关系。
接口在一定程度上实现 代码解耦(接口规范化+动态绑定机制)
【核心代码】
Build类
public interface Build {
public final static double PI = 3.14;
/**
* 切面积
*/
public void area();
/**
* 体积
*/
public void volume();
/**
* 用途
*/
public void use();
}
Tree类
public class Tree implements Build {
/**
* 树的半径(单位:m)
*/
private double r;
/**
* 树的高度(单位:m)
*/
private double h;
public Tree(double r, double h) {
this.r = r;
this.h = h;
}
@Override
public void area() {
System.out.println("切面积是:" + PI * r * r);
}
@Override
public void volume() {
System.out.println("体积是:" + PI * r * r * h);
}
@Override
public void use() {
System.out.println("我的小树用来造我们的小家");
}
}
Test类
public class Test {
public static void main(String[] args) {
Tree tree = new Tree(0.5, 5);
tree.area();
tree.volume();
tree.use();
}
}
【运行流程】
【前提引入】
继承不多解释,主要谈谈 super
关键字
基本介绍
super代表对父类(可以不是直接父类,也可以是超类)的引用,用于访问父类的属性、方法、构造器。
基本语法
super.属性名
,但不能访问父类的 private属性。super.方法名(实参列表)
,但不能访问父类的 private方法。注意事项:默认情况下构造器中都会隐式存在super(),调用父类的无参构造器。我们举个例子,看下如下代码:
public class Animal {
String name;
/**
* 这是有参构造器,
* 因此如果没有声明无参构造器,那么该类中不会存在无参构造器
*/
public Animal(String name) {
this.name = name;
}
}
class Dog extends Animal{
public Dog(){
}
}
这段代码会是错的,因为我们在调用Dog类的无参构造器中会默认存在一句super(),但是父类 Animal类 中并不存在无参构造器,因此发生错误,修改:
public class Animal {
String name;
/**
* 这是有参构造器,
* 因此如果没有声明无参构造器,那么该类中不会存在无参构造器
*/
public Animal(String name) {
this.name = name;
}
}
class Dog extends Animal{
public Dog(String name){
//如果显示的声明了 super调用,那么默认的 super() 就不会存在在代码中了
super(name);
}
}
【核心代码】
创建Plant类
public class Plant {
private String name;
private int age;
public Plant(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("我是一颗生长了 " + age + " 年的 " + name + " 树");
}
}
修改Tree类
public class Tree extends Plant implements Build {
/**
* 树的半径(单位:m)
*/
private double r;
/**
* 树的高度(单位:m)
*/
private double h;
public Tree(double r, double h, String name, int age) {
//父类构造器初始化
super(name, age);
this.r = r;
this.h = h;
}
@Override
public void introduce() {
//调用父类的 introduce 方法
super.introduce();
}
@Override
public void area() {
System.out.println("切面积是:" + PI * r * r);
}
@Override
public void volume() {
System.out.println("体积是:" + PI * r * r * h);
}
@Override
public void use() {
System.out.println("我的小树用来造我们的小家");
}
}
修改Test类
public class Test {
public static void main(String[] args) {
Tree tree = new Tree(0.5, 5,"逐浪",18);
tree.introduce();
}
}
【运行流程】