1.多态
- 多态参数:参数定义成父类类型,就可以传任意子类类型进去
- 向上转型
a) 语法: 父类类型 引用名 = new 子类类型();
b) 父类引用指向子类对象
c) 编译类型看左边,运行类型看右边
d) 可以调用父类中的所有成员(受访问修饰符影响)
e) 调用的时候,子类有就用子类的成员,子类没有就找父类(就近原则)
f) 不能调用子类中特有成员
- 注意事项
a) 多态的前提: 两个对象(类)存在继承关系
b) 属性的值看编译类型(即传入对象people 只会在people.java里面去寻找里面的属性,方法才会向下寻找。)
c) 只要编译能通过,方法都是看运行类型,属性看编译类型
d) instanceOf 比较操作符,用于判断对象的运行类型是否为xx类型或xx类型的子类型
e) 要调用子类中特有成员,还需要向下转型(其实就是强转),转回实际类型,瞎转会报错 ```java package com.dudu.app; public class people { public String call(){
//======================people.java======================================= package com.dudu.app; public class test extends people { public String call(){System.out.println("people");
return "people";}}
//======================students.java=======================================System.out.println("test");
return "test";}}
import com.dudu.app.people; import com.dudu.app.students; public class Hello { public static void main(String[] args){ people people = new people(); people students = new students();//用父类接收子类创建出来的对象 call1(people);//people call1(students);//students} public static String call1(people p){ //传入的是people父类,students是继承people父类 / students s=(students)p; 这句代码,就是把传入的p对象,强制向下转型,转换成他的子类,students /
p.call();
return "people";}}
// instanceof 比较操作符,用于判断对象的运行类型是否为xx类型或xx类型的子类型 /boolean b = students instanceof people; boolean b1 = students instanceof students; boolean b2 = students instanceof test; System.out.println(b+ “ “ + b1+ “ “+b2 +” “); / //true true false
4. 多态数组
```java
import com.dudu.app.people;
import com.dudu.app.students;
import com.dudu.app.test;
public class Hello {
public static void main(String[] args){
people people1 = new people();
people students = new students();
test test1 = new test();
people[] p1= new people[]{people1,students,test1};
for (int i = 0; i < p1.length; i++) {
p1[i].call();
}
}
}
- 动态绑定机制
- ==
既可以判断基本类型,也可以判断引用类型
基本类型判断值,引用类型判断地址 - equals
- equals 是Object类中的方法,只能判断引用类型 (比较内存地址)
- 默认判断的是地址是否相等
- 子类一般会重写equals方法,用于判断内容是否相等,比如Integer、String
3.toString
toString方法
public String tostring() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());}
a) 默认返回: 全类名 + @ + 哈希值的十六进制
b) 子类往往重写toString方法,用于返回对象的属性信息
c) 当直接输出一个对象时,toString方法会被默认的调用4.final
final应用场景
a) 不希望类被继承
c) 不希望类的属性值被修改(常量)
b) 不希望父类的方法被子类覆盖/重写(override)
d) 不希望局部变量(参数)被修改(局部常量)- final修饰实例属性,可以在定义时、构造器中、普通代码块中赋初值
- final修饰静态属性,可以在定义时 、静态代码块中赋初值
final注意事项
a) final修饰属性,必须赋值,并且不能再次修改
b) final可以修饰类、属性、方法和局部变量(参数),不能修饰构造器
c) 包装类(Integer、Double、Float、Boolean)和String都是final类
d) final修饰类,不能被继承,但是可以实例化对象(如何不让实例化)
e) final和static搭配使用,不会加载类5.抽象类
abstract只能修饰类和方法
用abstract关键字来修饰一个类时,这个类就叫抽象类
用abstract关键字来修饰一个方法时,这个方法就是抽象方法抽象类注意事项
抽象类可以有任意成员,可以被继承,可以没有抽象方法
有了抽象方法,则这个类必须声明为abstract
抽象类不能被实例化
继承了抽象类,则必须实现抽象类的所有抽象方法,除非它自己也声明为abstract类
抽象方法不能使用private、final和static来修饰package com.dudu.app;
public abstract class people {
public abstract void job();
// public abstract void test1();
/*如果这里创建了一个test1的抽象方法,那么必须在这个类的子类里面具体实现这个方法,不然就会报错的;
如果没有实现test1方法,那么可以选择把该子类也设置成抽象类,因为抽象类可以继承。但是,一旦设置成了抽象类,
这个类就不能被实例化了。
*/
public void sum(){
System.out.println("开始计算....");
job();
System.out.println("结束计算....");
}
}
//======================people.java=======================================
package com.dudu.app;
public class students extends people{
public void job(){
int result=0;
for (int i = 0; i <=100; i++) {
if( i%2==0){ result+=i;};}
System.out.println("偶数计算结果:"+result);
}
}
//======================students.java=======================================
package com.dudu.app;
public class test extends people{
public void job() {
int result = 0;
for (int i = 0; i <= 100; i++) {
result += i;}
System.out.println("总数计算结果:" + result);
}}
//======================test.java=======================================
import com.dudu.app.people;
import com.dudu.app.students;
import com.dudu.app.test;
public class Hello {
public static void main(String[] args){
people students = new students();
people test = new test();
students.job();//偶数计算结果:2550
test.job();//总数计算结果:5050
}
}
//======================Hello.java=======================================
6.接口
什么是接口
电脑USB 手机 鼠标 键盘 U盘
协议- 基本语法
interface 接口名{
//属性
//方法
}
class 类名 implements 接口名{
必须实现接口的所有抽象方法
} - 注意事项
a) 接口不能被实例化
b) 接口的修饰符只能是public和默认,这点和类的修饰符是一样的
c) 一个接口不能继承其它的类,但是可以继承多个别的接口
d) 接口中的方法都是public方法,抽象方法可以不用abstract修饰
e) 一个普通类实现接口,就必须将该接口的所有方法都实现
f) 抽象类实现接口,可以不用实现接口的方法
g) 一个类同时可以实现多个接口
h) 接口中的属性都是public static final修饰符
int a = 1; 实际上是 public static final int a = 1;(必须初始化)
接口中属性的访问形式: 接口名.属性名 接口的多态特性
多态参数、多态数组package com.dudu.app;
public interface USB {
public void keyboard();
public void mouse();
}
//======================USB.java=======================================接口创建
package com.dudu.app;
public class students implements USB{
public void keyboard(){
System.out.println("学生接口keyboard");
};
public void mouse(){
System.out.println("学生接口mouse");
};
}
//======================students.java=======================================继承与实现
package com.dudu.app;
public class test implements USB{
public void keyboard(){
System.out.println("test接口keyboard");
};
public void mouse(){
System.out.println("test接口mouse");
};
}
//======================test.java=======================================继承与实现
import com.dudu.app.USB;
import com.dudu.app.people;
import com.dudu.app.students;
import com.dudu.app.test;
public class Hello {
public static void main(String[] args){
USB[] A=new USB[]{new students(),new test()};//并不是实例化USB,只是用了一个USB数组接收子类的实例化对象;
computer.work(new students());
computer.work(new test());
}}
class computer{
public static void work(USB args){//students和test两者 implements USB 相当于是USB的子类了。
//传入他们两个的父类也就没问题了;
args.mouse();
args.keyboard();
}
}
//======================Hello.java=======================================调用
8.内部类
类的五大成员:属性 方法 构造器 代码块 内部类
内部类本质上就是一个类,类相关的功能都有- 内部类的分类
定义在外部类的成员位置上:
a)成员内部类(没用static修饰)
b)静态内部类 (使用static修饰)
定义在外部类局部位置上(比如方法内):
a)局部内部类(有类名)
b)匿名内部类(没有类名)
public class Hello {
public static void main(String[] args){
outclass outclass1111 = new outclass();
outclass.innerclass innerclass111= outclass1111.test();
System.out.println(innerclass111.A);
//System.out.println(outclass1111.getClass().getName());获取外部类的类名
}
}
class outclass{
public static String CC="TTTT";
public innerclass test(){
innerclass innerclass1111 = new innerclass("Python");
return innerclass1111;
}
class innerclass{//内部类
public String A="JAVA";
public innerclass(String a) {
A = a;
System.out.println( A+" 内部类调用");
System.out.println(CC);
}
//内部类不能设置静态属性static,但是可以访问外部类的static修饰的
}
}
//======================Hello.java=======================================
//写一个test方法,里面实例内部类,然后在再main函数里现事例外部类,再调用内部类
9.成员内部类
- 定义在外部类的成员位置上, 并且没有static修饰
注意事项
a) 可以直接访问外部类的所有成员, 包含私有的、静态的
b) 可以添加任意访问修饰符去修饰成员内部类, 因为它相当于一个成员
c) 成员内部类不能定义静态成员
d) 作用域与其他成员一样
e) 外部类可以访问成员内部类
f) 外部其他类可以访问成员内部类
new Test().new Inner();
在外部类里定义一个方法,返回内部类的对象
f) 外部类和内部类成员重名,遵循就近原则。想访问外部类的成员,可以使用(外部类名.this.成员)去访问10.静态内部类
static修饰;
- 静态方法能调用静态方法,不能调用实例方法;
-
11.局部内部类
局部内部类概念
定义在外部类的局部位置上, 比如方法中,并且有类名注意事项
a) 可以直接访问外部类的所有成员, 包含私有的、静态的
b) 如果定义在静态方法中,则只能访问外部类的静态成员
c) 局部内部类不能定义静态成员
d) 不能添加访问修饰符,可以使用final修饰,因为它就是一个局部变量
e) 作用域仅在定义它的代码块中,与局部变量一致
f) 外部类和内部类成员重名,遵循就近原则。想访问外部类的成员,可以使用(外部类名.this.成员)去访问(在实例方法中)。如果是定义在静态方法中,可以使用(外部类名.静态成员名)去访问
g) 外部类不能访问局部内部类12.匿名内部类
匿名内部类的语法
基于接口的匿名内部类
基于类(抽象类)的匿名内部类- 注意事项
a) 可以直接访问外部类的所有成员(受访问修饰符影响),包括静态的
b) 匿名内部类不能定义静态成员
c) 匿名内部类只能创建一个实例
d) 匿名内部类实际上也是有名字的,系统自动分配
e) 外部类和内部类成员重名,遵循就近原则。想访问外部类的成员,如果是静态成员,可以使用(外部类名.静态成员名)去访问,如果是实例成员,只有当匿名内部类处于外部类里面的时候,才能使用(外部类名.this.成员名)去访问
f) 外部类不能访问匿名内部类
g) 匿名内部类在定义的同时直接创建对象,并当作实参传递,代码简洁 ```java package com.dudu.app; public interface USB { public void keyboard(); public void mouse(); } //======================USB.java=======================================接口 package com.dudu.app; public abstract class USB2 { public abstract void keyboard(); public abstract void mouse(); } //======================USB2.java=======================================基于抽象类
import com.dudu.app.USB; import com.dudu.app.USB2; import com.dudu.app.students; public class Hello { public static void main(String[] args){ computer computer1 = new computer(); computer1.test1(new USB() { @Override public void keyboard() { System.out.println(“基于接口的匿名内部类11111111111”); } @Override public void mouse() { System.out.println(“基于接口的匿名内部类222222222222”); } }); computer1.test1(new USB() { @Override public void keyboard() { System.out.println(“基于接口的匿名内部类33333333333333”); }
@Override
public void mouse() {
System.out.println("基于接口的匿名内部类4444444444444");
}
});
computer computer2 = new computer();
computer2.test2(new USB2() {
@Override
public void keyboard() {
System.out.println("基于类(抽象类)的匿名内部类 55555555555555");
}
@Override
public void mouse() {
System.out.println("基于类(抽象类)的匿名内部类 66666666666666666");
}
});
} }
class computer{ public void test1(USB AA){ AA.keyboard(); AA.mouse(); } public void test2(USB2 AA){ AA.keyboard(); AA.mouse(); } } //======================Hello.java=======================================
//使用内部类的主要特点是因为只使用一次;
<a name="LUUDy"></a>
#### 13.字符串
1. 字符串特性<br />a) 字符串常量是用双引号括起的字符序列。例如: "你好"、"100"、"xiaojianbang"等<br />b) String是final类, 不能被其他的类继承<br />c) String类有属性 private final char value[]; 用于存放字符串内容<br />d) String对象创建方式:直接赋值、调用构造器<br />e) String类的构造器有很多<br />f) 直接赋值和调用构造器,创建的字符串,是有区别的
```java
public class Hello {
public static void main(String[] args){
String a = "xiaojianbang";
String b = new String("xiaojianbang");
System.out.println(a.equals(b));//true 内容比较
System.out.println(a == b);//false 内存地址比较
}
}