多态
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
/*
多态注意事项:
1.多态是方法的多态,属性没有多态
2.父类和子类,有联系 类型转换异常! ClassCastException
3.存在的条件: 继承关系,方法需要重写 父类引用指向子类对象 father f1 = new Son();
不能重写的:
1.static 静态方法属于类,它不属于实例
2.final 常量;
3.private 方法
* */
/*
package com.oop.demo06;
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void eat(){
System.out.println("eat");
}
}
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
public class Application {
public static void main(String[] args) {
//一个对象的实际类型是确定的
// new Student();
// new Person();
//可以指向的引用类型就不确定了:父类的引用指向子类
//Student能调用的方法都是自己的或者继承父类的
Student s1 = new Student();
//Person 父类型,可以指向子类,但是不能调用子类独有的方法
Person s2 = new Student();
Object s3 = new Student();
//对象能执行哪些方法,主要看对象左边的类型,和右边关系不大!
s2.run();//子类重写了父类的方法,执行子类的方法
s1.run();
s1.eat();
}
}
* */
instanceof和类型转换
判断一个对象是什么类型
package com.oop.demo06;
public class Person {
public void run(){
System.out.println("run");
}
}
/*
//Object > String
//Object > Person > Teacher
//Object > Person > Student
Object object = new Student();
//System.out.println(X instanceof Y);//能不能编译通过,取决于X是否与Y有继承关系,且类X是实例X的引用类型
System.out.println(object instanceof Student);//true
System.out.println(object instanceof Person);//true
System.out.println(object instanceof Object);//true
System.out.println(object instanceof Teacher);//false
System.out.println(object instanceof String);//false
System.out.println("==============================");
Person person = new Student();
System.out.println(person instanceof Student);//true
System.out.println(person instanceof Person);//true
System.out.println(person instanceof Object);//true
System.out.println(person instanceof Teacher);//false
//System.out.println(person instanceof String);//编译报错
System.out.println("==============================");
Student student = new Student();
System.out.println(student instanceof Student);//true
System.out.println(student instanceof Person);//true
System.out.println(student instanceof Object);//true
//System.out.println(student instanceof Teacher);//编译报错
//System.out.println(student instanceof String);//编译报错
package com.oop.demo06;
public class Student extends Person {
public void go(){
System.out.println("go");
}
}
package com.oop;
import com.oop.demo06.Person;
import com.oop.demo06.Student;
import com.oop.demo06.Teacher;
public class Application {
public static void main(String[] args) {
// //类型之间的转化:父 子
//
// //高 低
// Person obj = new Student();
//
// //student将这个对象转换为Student类型,我们就可以使用Student类型的方法了!
//
Student student = (Student) obj;
student.go();
// ((Student) obj).go();
//子类转换为父类,可能丢失自己本来的一些方法!
Student student = new Student();
student.go();
Person person = student;
}
}
/*
1.父类引用指向子类的对象
2.把子类转换为父类,向上转型
3.把夫类转换为子类,向下转型,强制转换
4.方便方法的调用,减少重复的代码
抽象:封装,继承,多态 抽象类,接口
* */
static
非静态的方法可以调用静态方法的东西,而静态方法可以调用静态方法的
package com.oop.demo07;
//static :
public class Student {
private static int age;//静态变量
private double score;//非静态变量
public void run(){
go();
}
public static void go(){
}
public static void main(String[] args) {
new Student().run();
go();
}
}
package com.oop.demo07;
public class Person {
//2 :赋初始值
{
System.out.println("匿名代码块");
}
//1 : 只执行一次!
static {
System.out.println("静态代码块");
}
//3
public Person() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("==================================");
Person person2 = new Person();
}
}
package com.oop.demo07;
//静态导入包
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Test {
public static void main(String[] args) {
System.out.println(random());
System.out.println(PI);
}
}
抽象类
抽象类的作用:
- 定义共同的属性和方法: 抽象类可以包含属性和方法的定义,这些属性和方法可以被其子类继承和重写。这有助于实现代码的复用和共享,使得子类可以继承父类的通用行为和状态。12
- 限制继承和实例化: 抽象类不能被实例化,只能被继承。这种设计用于限制某个类只能作为父类存在,不能被直接实例化。这有助于控制类的层次结构和实例的创建方式。1
- 强制子类实现抽象方法: 抽象类中可以包含抽象方法,子类必须实现这些抽象方法。这确保了所有子类都具有一致的行为,同时也提供了灵活性,因为子类可以根据自己的需求重写这些方法。
- 提高代码的可维护性、扩展性和灵活性: 通过使用抽象类,可以更好地组织代码结构,提高代码的可维护性和扩展性。抽象类作为模板,为子类提供了一组固定的行为描述,而具体的实现细节则留给子类去完成。2
总之,抽象类在Java中扮演着重要的角色,它们是面向对象编程中的一个核心概念,通过继承和抽象方法的引入,使得代码更加模块化、可重用和可扩展。
package com.oop.demo08;
//abstract 抽象类 : 类 extends :单继承 (接口可以多继承)
public abstract class Action {
//约束 有人帮我们实现
//abstract 抽象方法,只有方法名字,没有方法的实现!
public abstract void doSomething();
//1.不能new这个抽象类,只能靠子类去实现它:约束!
//2.抽象类中可以写普通方法
//3.抽象方法必须在抽象类中
//抽象的抽象:约束
}
/*
package com.oop.demo08;
//抽象类的所有方法,继承了它的子类,都必须要实现它的方法,除非子类方法加 abstract
public class A extends Action{
@Override
public void doSomething() {
}
}
*/
接口
package com.oop.demo09;
//抽象的思维
//interface 定义的关键字,接口都需要实现类
public interface UserService {
//属性默认的常量,public static final
int AGE = 99;
//接口中的所有定义的方法其实都是抽象的 public abstract
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
package com.oop.demo09;
public interface TimeService {
void timer();
}
package com.oop.demo09;
//抽象类: extends
//类 可以实现接口 implements 接口
//实现了接口的类,就需要重写接口中的方法
//多继承 利用接口实现多继承
public class UserServiceImpl implements UserService,TimeService{
@Override
public void add(String name) {
}
@Override
public void delete(String name) {
}
@Override
public void update(String name) {
}
@Override
public void query(String name) {
}
@Override
public void timer() {
}
}
作用: 1.约束 2.定义一些方法,让不同的人实现~ 10--->1 3.方法 public abstract 4.常量 public static final 5.接口不能被实例化~,接口中没有构造方法~ 6.implements可以实现多个接口 7.必须要重写接口中的方法
N种内部类
package com.oop.demo10;
public class Outer {
private int id = 10;
public void out(){
System.out.println("这是外部类的方法");
}
public class Inner{
public void in(){
System.out.println("这是内部类的方法");
}
public void getID() {
}
}
//局部内部类
public void method(){
class Inner{
public void in(){
}
}
}
}
//一个Java类中可以有多个class类,但是只能有一个public class
class A{
}
package com.oop.demo10;
public class Text {
public static void main(String[] args) {
//没有名字初始化类,不用将实例保存到变量中~
new Apple().eat();
UserService userService = new UserService(){
@Override
public void hello() {
}
};
}
}
class Apple{
public void eat(){
System.out.println("1");
}
}
interface UserService{
void hello();
}
package com.oop;
import com.oop.demo10.Outer;
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
//通过这个外部类来实例化内部类~
Outer.Inner inner = outer.new Inner();
inner.getID();
}
}