客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。
类的组成是由属性和行为两部分组成
类的定义步骤:
①定义类
②编写类的成员变量
③编写类的成员方法
public class 类名 {// 成员变量变量1的数据类型 变量1;变量2的数据类型 变量2;…// 成员方法方法1;方法2;
}
示例代码:
/*手机类:类名:手机(Phone)成员变量:品牌(brand)价格(price)成员方法:打电话(call)发短信(sendMessage)*/
public class Phone {//成员变量String brand;int price;//成员方法public void call() {System.out.println("打电话");}public void sendMessage() {System.out.println("发短信");}
}
/*创建对象格式:类名 对象名 = new 类名();范例:Phone p = new Phone();使用对象1:使用成员变量格式:对象名.变量名范例:p.brand2:使用成员方法格式:对象名.方法名()范例:p.call()*/
public class PhoneDemo {public static void main(String[] args) {//创建对象Phone p = new Phone();//使用成员变量System.out.println(p.brand);System.out.println(p.price);p.brand = "小米";p.price = 2999;System.out.println(p.brand);System.out.println(p.price);//使用成员方法p.call();p.sendMessage();}
}
class Student {//成员变量String name;int age;//成员方法public void study() {System.out.println("好好学习,天天向上");}public void doHomework() {System.out.println("键盘敲烂,月薪过万");}
}
/*学生测试类*/
public class StudentDemo {public static void main(String[] args) {//创建对象Student s = new Student();//使用对象System.out.println(s.name + "," + s.age);s.name = "林青霞";s.age = 30;System.out.println(s.name + "," + s.age);s.study();s.doHomework();}
}
总结:
多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份
总结
当多个对象的引用指向同一个内存空间(变量所记录的地址值是一样的)
只要有任何一个对象修改了内存中的数据,随后,无论使用哪一个对象进行数据获取,都是修改后的数据。
private是一个修饰符,可以用来修饰成员(成员变量,成员方法)
被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作
示例代码:
/*学生类*/
class Student {//成员变量String name;private int age;//提供get/set方法public void setAge(int a) {if(a<0 || a>120) {System.out.println("你给的年龄有误");} else {age = a;}}public int getAge() {return age;}//成员方法public void show() {System.out.println(name + "," + age);}
}
/*学生测试类*/
public class StudentDemo {public static void main(String[] args) {//创建对象Student s = new Student();//给成员变量赋值s.name = "林青霞";s.setAge(30);//调用show方法s.show();}
}
需求:定义标准的学生类,要求name和age使用private修饰,并提供set和get方法以及便于显示数据的show方法,测试类中创建对象并使用,最终控制台输出 林青霞,30
示例代码:
/*学生类*/
class Student {//成员变量private String name;private int age;//get/set方法public void setName(String n) {name = n;}public String getName() {return name;}public void setAge(int a) {age = a;}public int getAge() {return age;}public void show() {System.out.println(name + "," + age);}
}
/*学生测试类*/
public class StudentDemo {public static void main(String[] args) {//创建对象Student s = new Student();//使用set方法给成员变量赋值s.setName("林青霞");s.setAge(30);s.show();//使用get方法获取成员变量的值System.out.Name() + "---" + s.getAge());System.out.Name() + "," + s.getAge());}
}
public class Student {private String name;private int age;public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}public void show() {System.out.println(name + "," + age);}
}
this代表当前调用方法的引用,哪个对象调用的方法,this就代表哪一个对象
示例代码:
public class StudentDemo {public static void main(String[] args) {Student s1 = new Student();s1.setName("林青霞");Student s2 = new Student();s2.setName("张曼玉");}
}
图解:
构造方法是一种特殊的方法
作用:创建对象 Student stu = new Student();
格式:
public class 类名{
修饰符 类名( 参数 ) {
}
}
功能:主要是完成对象数据的初始化
示例代码:
class Student {private String name;private int age;//构造方法public Student() {System.out.println("无参构造方法");}public void show() {System.out.println(name + "," + age);}
}
/*测试类*/
public class StudentDemo {public static void main(String[] args) {//创建对象Student s = new Student();s.show();}
}
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法
无论是否使用,都手工书写无参数构造方法
可以使用带参构造,为成员变量进行初始化
/*学生类*/
class Student {private String name;private int age;public Student() {}public Student(String name) {this.name = name;}public Student(int age) {this.age = age;}public Student(String name,int age) {this.name = name;this.age = age;}public void show() {System.out.println(name + "," + age);}
}
/*测试类*/
public class StudentDemo {public static void main(String[] args) {//创建对象Student s1 = new Student();s1.show();//public Student(String name)Student s2 = new Student("林青霞");s2.show();//public Student(int age)Student s3 = new Student(30);s3.show();//public Student(String name,int age)Student s4 = new Student("林青霞",30);s4.show();}
}
class Student {//成员变量private String name;private int age;//构造方法public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}//成员方法public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}public void show() {System.out.println(name + "," + age);}
}
/*创建对象并为其成员变量赋值的两种方式1:无参构造方法创建对象后使用setXxx()赋值2:使用带参构造方法直接创建带有属性值的对象
*/
public class StudentDemo {public static void main(String[] args) {//无参构造方法创建对象后使用setXxx()赋值Student s1 = new Student();s1.setName("林青霞");s1.setAge(30);s1.show();//使用带参构造方法直接创建带有属性值的对象Student s2 = new Student("林青霞",30);s2.show();}
}
继承的概念
实现继承的格式
继承带来的好处
示例代码
public class Fu {public void show() {System.out.println("show方法被调用");}
}
public class Zi extends Fu {public void method() {System.out.println("method方法被调用");}
}
public class Demo {public static void main(String[] args) {//创建对象,调用方法Fu f = new Fu();f.show();Zi z = new Zi();z.method();z.show();}
}
在子类方法中访问一个变量,采用的是就近原则。
示例代码
class Fu {int num = 10;
}
class Zi {int num = 20;public void show(){int num = 30;System.out.println(num);}
}
public class Demo1 {public static void main(String[] args) {Zi z = new Zi();z.show(); // 输出show方法中的局部变量30}
}
注意:子类中所有的构造方法默认都会访问父类中无参的构造方法
子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化,原因在于,每一个子类构造方法的第一条语句默认都是:super()
问题:如果父类中没有无参构造方法,只有带参构造方法,该怎么办呢?
1. 通过使用super关键字去显示的调用父类的带参构造方法
2. 在父类中自己提供一个无参构造方法
推荐方案:
自己给出无参构造方法
通过子类对象访问一个方法
public class Fu {private void show() {System.out.println("Fu中show()方法被调用");}void method() {System.out.println("Fu中method()方法被调用");}
}public class Zi extends Fu {/* 编译【出错】,子类不能重写父类私有的方法*/@Overrideprivate void show() {System.out.println("Zi中show()方法被调用");}/* 编译【出错】,子类重写父类方法的时候,访问权限需要大于等于父类 */@Overrideprivate void method() {System.out.println("Zi中method()方法被调用");}/* 编译【通过】,子类重写父类方法的时候,访问权限需要大于等于父类 */@Overridepublic void method() {System.out.println("Zi中method()方法被调用");}
}
Java中继承的注意事项
多层继承示例代码:
public class Granddad {public void drink() {System.out.println("爷爷爱喝酒");}}public class Father extends Granddad {public void smoke() {System.out.println("爸爸爱抽烟");}}public class Mother {public void dance() {System.out.println("妈妈爱跳舞");}}
public class Son extends Father {// 此时,Son类中就同时拥有drink方法以及smoke方法
}
需求:定义老师类和学生类,然后写代码测试;最后找到老师类和学生类当中的共性内容,抽取出一个父类,用继承的方式改写代码,并进行测试
步骤:
①定义老师类(姓名,年龄,教书())
②定义学生类(姓名,年龄,学习())
③定义测试类,写代码测试
④共性抽取父类,定义人类(姓名,年龄)
⑤定义老师类,继承人类,并给出自己特有方法:教书()
⑥定义学生类,继承人类,并给出自己特有方法:学习()
⑦定义测试类,写代码测试
示例代码:
class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}class Teacher extends Person {public Teacher() {}public Teacher(String name,int age) {super(name,age);}public void teach() {System.out.println("用爱成就每一位学员");}}class Student extends Person{public Student() {}public Student(String name, int age) {super(name,age);}public void study(){System.out.println("学生学习");}}class PersonDemo {public static void main(String[] args){//创建老师类对象并进行测试Teacher t1 = new Teacher();t1.setName("林青霞");t1.setAge(30);System.out.Name() + "," + t1.getAge());t1.teach();Teacher t2 = new Teacher("风清扬", 33);System.out.Name() + "," + t2.getAge());t2.teach();// 创建学生类对象测试Student s = new Student("张三",23);System.out.Name() + "," + s.getAge());s.study();}
}
需求:请采用继承的思想实现猫和狗的案例,并在测试类中进行测试
分析:
①猫:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:get/set方法,抓老鼠()
②狗:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:get/set方法,看门()
③共性:
成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法
步骤:
1、定义动物类(Animal)
【成员变量:姓名,年龄】【 构造方法:无参,带参】【成员方法:get/set方法】
2、定义猫类(Cat),继承动物类
【构造方法:无参,带参】【成员方法:抓老鼠() 】
3、定义狗类(Dog),继承动物类
【构造方法:无参,带参】【成员方法:看门() 】
4、定义测试类(AnimalDemo),写代码测试
示例代码:
class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}public void catchMouse() {System.out.println("猫抓老鼠");}
}
class Dog extends Animal {public Dog() {}public Dog(String name, int age) {super(name, age);}public void lookDoor() {System.out.println("狗看门");}
}
/*测试类*/
public class AnimalDemo {public static void main(String[] args) {//创建猫类对象并进行测试Cat c1 = new Cat();c1.setName("加菲猫");c1.setAge(5);System.out.Name() + "," + c1.getAge());c1.catchMouse();Cat c2 = new Cat("加菲猫", 5);System.out.Name() + "," + c2.getAge());c2.catchMouse();}
}
导包的意义
使用不同包下的类时,使用的时候要写类的全路径,写起来太麻烦了
为了简化带包的操作,Java就提供了导包的功能
导包的格式
格式:import 包名;
范例:import java.util.Scanner;
示例代码(没有使用导包,创建的Scanner对象)
package com.heima;public class Demo {public static void main(String[] args) {// 1. 没有导包,创建Scnaner对象java.util.Scanner sc = new java.util.Scanner(System.in);}
}
package com.heima;import java.util.Scanner;public class Demo {public static void main(String[] args) {// 1. 没有导包,创建Scnaner对象Scanner sc = new Scanner(System.in);}
}
fianl修饰基本数据类型变量
final修饰引用数据类型变量
final 修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的
举例:
public static void main(String[] args){final Student s = new Student(23);s = new Student(24); // 错误s.setAge(24); // 正确
}
class Student {public String name; //姓名public int age; //年龄public static String university; //学校 共享数据!所以设计为静态!public void show() {System.out.println(name + "," + age + "," + university);}}public class StaticDemo {public static void main(String[] args) {// 为对象的共享数据赋值Student.university = "传智大学";Student s1 = new Student();s1.name = "林青霞";s1.age = 30;s1.show();Student s2 = new Student();s2.name = "风清扬";s2.age = 33;s2.show();}
}
什么是多态
同一个对象,在不同时刻表现出来的不同形态
多态的前提
成员访问特点
成员变量
编译看父类,运行看父类
成员方法
编译看父类,运行看子类
代码演示
动物类
public class Animal {public int age = 40;public void eat() {System.out.println("动物吃东西");}
}
猫类
public class Cat extends Animal {public int age = 20;public int weight = 10;@Overridepublic void eat() {System.out.println("猫吃鱼");}public void playGame() {System.out.println("猫捉迷藏");}
}
测试类
public class AnimalDemo {public static void main(String[] args) {//有父类引用指向子类对象Animal a = new Cat();System.out.println(a.age);
// System.out.println(a.weight);a.eat();
// a.playGame();}
}
好处
提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作
弊端
不能使用子类的特有成员
向上转型
父类引用指向子类对象就是向上转型
向下转型
格式:子类型 对象名 = (子类型)父类引用;
代码演示
public class Animal {public void eat() {System.out.println("动物吃东西");}
}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}public void playGame() {System.out.println("猫捉迷藏");}
}
public class AnimalDemo {public static void main(String[] args) {//多态//向上转型Animal a = new Cat();a.eat();
// a.playGame();//向下转型Cat c = (Cat)a;c.eat();c.playGame();}
}
案例需求
代码实现
动物类
public class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat() {System.out.println("动物吃东西");}
}
猫类
public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫吃鱼");}
}
狗类
public class Dog extends Animal {public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗吃骨头");}
}
测试类
public class AnimalDemo {public static void main(String[] args) {//创建猫类对象进行测试Animal a = new Cat();a.setName("加菲");a.setAge(5);System.out.Name() + "," + a.getAge());a.eat();a = new Cat("加菲", 5);System.out.Name() + "," + a.getAge());a.eat();}
}
当我们在做子类共性功能抽取时,有些方法在父类中并没有具体的体现,这个时候就需要抽象类了!
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类!
抽象类和抽象方法必须使用 abstract 关键字修饰
//抽象类的定义
public abstract class 类名 {}
//抽象方法的定义
public abstract void eat();
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能实例化
抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
成员的特点
代码演示
public abstract class Animal {private int age = 20;private final String city = "北京";public Animal() {}public Animal(int age) {this.age = age;}public void show() {age = 40;System.out.println(age);// city = "上海";System.out.println(city);}public abstract void eat();}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}}
public class AnimalDemo {public static void main(String[] args) {Animal a = new Cat();a.eat();a.show();}}
案例需求
请采用抽象类的思想实现猫和狗的案例,并在测试类中进行测试
代码实现
public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void eat();}
public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫吃鱼");}}
public class Dog extends Animal {public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗吃骨头");}}
public class AnimalDemo {public static void main(String[] args) {//创建对象,按照多态的方式Animal a = new Cat();a.setName("加菲");a.setAge(5);System.out.Name()+","Age());a.eat();System.out.println("--------");a = new Cat("加菲",5);System.out.Name()+","Age());a.eat();}}
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中的接口更多的体现在对行为的抽象!
接口用关键字interface修饰
public interface 接口名 {}
类实现接口用implements表示
public class 类名 implements 接口名 {}
接口不能实例化
接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
多态的形式:具体类多态,抽象类多态,接口多态。
接口的子类
要么重写接口中的所有抽象方法
要么子类也是抽象类
成员特点
成员变量
只能是常量
默认修饰符:public static final
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
只能是抽象方法
默认修饰符:public abstract
关于接口中的方法,JDK8和JDK9中有一些新特性,后面再讲解
代码演示
public interface Inter {public int num = 10;public final int num2 = 20;// public static final int num3 = 30;int num3 = 30;// public Inter() {}// public void show() {}public abstract void method();void show();}
public class InterImpl extends Object implements Inter {public InterImpl() {super();}@Overridepublic void method() {System.out.println("method");}@Overridepublic void show() {System.out.println("show");}}
public class InterfaceDemo {public static void main(String[] args) {Inter i = new InterImpl();// i.num = 20;System.out.println(i.num);// i.num2 = 40;System.out.println(i.num2);System.out.println(Inter.num);}}
案例需求
对猫和狗进行训练,他们就可以跳高了,这里加入跳高功能。
请采用抽象类和接口来实现猫狗案例,并在测试类中进行测试。
代码实现
public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void eat();}
public interface Jumpping {public abstract void jump();}
public class Cat extends Animal implements Jumpping {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫吃鱼");}@Overridepublic void jump() {System.out.println("猫可以跳高了");}}
public class AnimalDemo {public static void main(String[] args) {//创建对象,调用方法Jumpping j = new Cat();j.jump();System.out.println("--------");Animal a = new Cat();a.setName("加菲");a.setAge(5);System.out.Name()+","Age());a.eat();// a.jump();a = new Cat("加菲",5);System.out.Name()+","Age());a.eat();System.out.println("--------");Cat c = new Cat();c.setName("加菲");c.setAge(5);System.out.Name()+","Age());c.eat();c.jump();}}
类与类的关系
继承关系,只能单继承,但是可以多层继承
类与接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口与接口的关系
继承关系,可以单继承,也可以多继承
成员区别
抽象类
变量,常量;有构造方法;有抽象方法,也有非抽象方法
接口
常量;抽象方法
关系区别
类与类
继承,单继承
类与接口
实现,可以单实现,也可以多实现
接口与接口
继承,单继承,多继承
设计理念区别
抽象类
对类抽象,包括属性、行为
接口
对行为抽象,主要是行为
我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所学知识分析,这个案例中有哪些具体类,哪些抽象类,哪些接口,并用代码实现。
public abstract class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void eat();
}
public abstract class Player extends Person {public Player() {}public Player(String name, int age) {super(name, age);}public abstract void study();
}
public abstract class Coach extends Person {public Coach() {}public Coach(String name, int age) {super(name, age);}public abstract void teach();
}
public interface SpeakEnglish {public abstract void speak();
}
public class BasketballCoach extends Coach {public BasketballCoach() {}public BasketballCoach(String name, int age) {super(name, age);}@Overridepublic void teach() {System.out.println("篮球教练教如何运球和投篮");}@Overridepublic void eat() {System.out.println("篮球教练吃羊肉,喝羊奶");}
}
public class PingPangCoach extends Coach implements SpeakEnglish {public PingPangCoach() {}public PingPangCoach(String name, int age) {super(name, age);}@Overridepublic void teach() {System.out.println("乒乓球教练教如何发球和接球");}@Overridepublic void eat() {System.out.println("乒乓球教练吃小白菜,喝大米粥");}@Overridepublic void speak() {System.out.println("乒乓球教练说英语");}
}
public class PingPangPlayer extends Player implements SpeakEnglish {public PingPangPlayer() {}public PingPangPlayer(String name, int age) {super(name, age);}@Overridepublic void study() {System.out.println("乒乓球运动员学习如何发球和接球");}@Overridepublic void eat() {System.out.println("乒乓球运动员吃大白菜,喝小米粥");}@Overridepublic void speak() {System.out.println("乒乓球运动员说英语");}
}
public class BasketballPlayer extends Player {public BasketballPlayer() {}public BasketballPlayer(String name, int age) {super(name, age);}@Overridepublic void study() {System.out.println("篮球运动员学习如何运球和投篮");}@Overridepublic void eat() {System.out.println("篮球运动员吃牛肉,喝牛奶");}
}
1、类名作为方法的形参
方法的形参是类名,其实需要的是该类的对象
实际传递的是该对象的【地址值】
2、类名作为方法的返回值
方法的返回值是类名,其实返回的是该类的对象
实际传递的,也是该对象的【地址值】
示例代码:
class Cat {public void eat() {System.out.println("猫吃鱼");}
}
class CatOperator {public void useCat(Cat c) { //Cat c = new Cat();c.eat();}public Cat getCat() {Cat c = new Cat();return c;}
}
public class CatDemo {public static void main(String[] args) {//创建操作类对象,并调用方法CatOperator co = new CatOperator();Cat c = new Cat();co.useCat(c);Cat c2 = co.getCat(); //new Cat()c2.eat();}
}
抽象类作为形参和返回值
示例代码:
abstract class Animal {public abstract void eat();
}
class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫吃鱼");}
}
class AnimalOperator {public void useAnimal(Animal a) { //Animal a = new Cat();a.eat();}public Animal getAnimal() {Animal a = new Cat();return a;}
}
public class AnimalDemo {public static void main(String[] args) {//创建操作类对象,并调用方法AnimalOperator ao = new AnimalOperator();Animal a = new Cat();ao.useAnimal(a);Animal a2 = ao.getAnimal(); //new Cat()a2.eat();}
}
接口作为形参和返回值
示例代码:
interface Jumpping {void jump();
}
class JumppingOperator {public void useJumpping(Jumpping j) { //Jumpping j = new Cat();j.jump();}public Jumpping getJumpping() {Jumpping j = new Cat();return j;}
}
class Cat implements Jumpping {@Overridepublic void jump() {System.out.println("猫可以跳高了");}
}
public class JumppingDemo {public static void main(String[] args) {//创建操作类对象,并调用方法JumppingOperator jo = new JumppingOperator();Jumpping j = new Cat();jo.useJumpping(j);Jumpping j2 = jo.getJumpping(); //new Cat()j2.jump();}
}
内部类概念
内部类定义格式
格式&举例:
/*格式:class 外部类名{修饰符 class 内部类名{}}
*/class Outer {public class Inner {}
}
内部类的访问特点
示例代码:
/*内部类访问特点:内部类可以直接访问外部类的成员,包括私有外部类要访问内部类的成员,必须创建对象*/
public class Outer {private int num = 10;public class Inner {public void show() {System.out.println(num);}}public void method() {Inner i = new Inner();i.show();}
}
成员内部类的定义位置
外界创建成员内部类格式
成员内部类的推荐使用方案
示例代码:
class Outer {private int num = 10;private class Inner {public void show() {System.out.println(num);}}public void method() {Inner i = new Inner();i.show();}
}
public class InnerDemo {public static void main(String[] args) {//Outer.Inner oi = new Outer().new Inner();//oi.show();Outer o = new Outer();o.method();}
}
局部内部类定义位置
局部内部类方式方式
示例代码
class Outer {private int num = 10;public void method() {int num2 = 20;class Inner {public void show() {System.out.println(num);System.out.println(num2);}}Inner i = new Inner();i.show();}
}
public class OuterDemo {public static void main(String[] args) {Outer o = new Outer();o.method();}
}
匿名内部类的前提
匿名内部类的格式
格式:new 类名 ( ) { 重写方法 } new 接口名 ( ) { 重写方法 }
举例:
new Inter(){@Overridepublic void method(){}
}
匿名内部类的本质
匿名内部类的细节
匿名内部类可以通过多态的形式接受
Inter i = new Inter(){@Overridepublic void method(){}
}
匿名内部类直接调用方法
interface Inter{void method();
}
class Test{public static void main(String[] args){new Inter(){@Overridepublic void method(){System.out.println("我是匿名内部类"); }}.method(); // 直接调用方法}
}
匿名内部类在开发中的使用
示例代码:
public class JumppingDemo {public static void main(String[] args) {//需求:创建接口操作类的对象,调用method方法JumppingOperator jo = new JumppingOperator();Jumpping j = new Cat();jo.method(j);Jumpping j2 = new Dog();jo.method(j2);System.out.println("--------");jo.method(new Jumpping() {@Overridepublic void jump() {System.out.println("猫可以跳高了");}});jo.method(new Jumpping() {@Overridepublic void jump() {System.out.println("狗可以跳高了");}});}}
本文发布于:2024-01-29 14:23:19,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170650940115900.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |