Java是一种面向对象的高级编程语言。
三大特征:封装,继承,多态
面向对象最重要的两个概念:类和对象
定义格式
修饰符 class 类名{ }
类中的成分:有且仅有五大成分 修饰符 class 类名{ 1.成员变量(Field): 描述类或者对象的属性信息的。 2.成员方法(Method): 描述类或者对象的行为信息的。 3.构造器(Constructor): 初始化一个对象返回。 4.代码块 5.内部类 } 类中有且仅有这五种成分,否则代码报错! public class ClassDemo { System.out.println(1);//报错 }
构造器格式:
修饰符 类名(形参列表){ }
作用:初始化类的一个对象返回
分类:无参数构造器,有参数构造器
注意:一个类默认自带一个无参数构造器,写了有参数构造器默认的无参数构造器就消失,还需要用无参数构造器就要重新写
构造器初始化对象的格式:类名 对象名称 = new 构造器
包:分门别类的管理各种不同的技术,便于管理技术,扩展技术,阅读技术
定义包的格式:package 包名
,必须放在类名的最上面
导包格式:import 包名.类名
相同包下的类可以直接访问;不同包下的类必须导包才可以使用
封装的哲学思维:合理隐藏,合理暴露
封装最初的目的:提高代码的安全性和复用性,组件化
封装的步骤:
使用 private 修饰成员变量的原因:实现数据封装,不想让别人使用修改你的数据,比较安全
this 关键字的作用:
Java 是通过成员变量是否有 static 修饰来区分是类的还是属于对象的。
static 静态修饰的成员(方法和成员变量)属于类本身的。
按照有无 static 修饰,成员变量和方法可以分为:
成员变量:
成员方法:
成员变量的访问语法:
静态成员变量:只有一份可以被类和类的对象共享访问
实例成员变量:
成员方法的访问语法:
静态方法:有 static 修饰,属于类
实例方法:无 static 修饰,属于对象
public class Student { // 1.静态方法:有static修饰,属于类,直接用类名访问即可! public static void inAddr(){ } // 2.实例方法:无static修饰,属于对象,必须用对象访问! public void eat(){} public static void main(String[] args) { // a.类名.静态方法 Student.inAddr(); inAddr(); // b.对象.实例方法 // Student.eat(); // 报错了! Student zbj = new Student(); zbj.eat(); } }
内存问题:
栈内存存放 main 方法和地址
堆内存存放对象和变量
方法区存放 class 和静态变量(jdk8 以后移入堆)
访问问题:
继承是 Java 中一般到特殊的关系,是一种子类到父类的关系
继承的作用:
继承的特点:
继承的格式:
子类 extends 父类{ }
子类不能继承父类的东西:
public class ExtendsDemo { public static void main(String[] args) { Cat c = new Cat(); // c.run(); Cat.test(); System.out.println(Cat.schoolName); } } class Cat extends Animal{ } class Animal{ public static String schoolName ="seazean"; public static void test(){} private void run(){} }
继承后成员变量的访问特点:就近原则,子类有找子类,子类没有找父类,父类没有就报错
如果要申明访问父类的成员变量可以使用:super.父类成员变量,super指父类引用
public class ExtendsDemo { public static void wmain(String[] args) { Wolf w = new Wolf();w w.showName(); } } class Wolf extends Animal{ private String name = "子类狼"; public void showName(){ String name = "局部名称"; System.out.println(name); // 局部name System.out.println(this.name); // 子类对象的name System.out.println(super.name); // 父类的 System.out.println(name1); // 父类的 //System.out.println(name2); // 报错。子类父类都没有 } } class Animal{ public String name = "父类动物名称"; public String name1 = "父类"; }
子类继承了父类就得到了父类的方法,可以直接调用,受权限修饰符的限制,也可以重写方法
方法重写:子类重写一个与父类申明一样的方法来覆盖父类的该方法
方法重写的校验注解:@Override
子类可以扩展父类的功能,但不能改变父类原有的功能,重写有以下三个限制:
继承中的隐藏问题:
public class ExtendsDemo { public static void main(String[] args) { Wolf w = new Wolf(); w.run(); } } class Wolf extends Animal{ @Override public void run(){}// } class Animal{ public void run(){} }
为什么子类构造器会先调用父类构造器?
class Animal{ public Animal(){ System.out.println("==父类Animal的无参数构造器=="); } } class Tiger extends Animal{ public Tiger(){ super(); // 默认存在的,根据参数去匹配调用父类的构造器。 System.out.println("==子类Tiger的无参数构造器=="); } public Tiger(String name){ //super(); 默认存在的,根据参数去匹配调用父类的构造器。 System.out.println("==子类Tiger的有参数构造器=="); } }
为什么 Java 是单继承的?
答:反证法,假如 Java 可以多继承,请看如下代码:
class A{ public void test(){ System.out.println("A"); } } class B{ public void test(){ System.out.println("B"); } } class C extends A , B { public static void main(String[] args){ C c = new C(); c.test(); // 出现了类的二义性!所以Java不能多继承!! } }
继承后 super 调用父类构造器,父类构造器初始化继承自父类的数据。
总结与拓展:
注意:
public class ThisDemo { public static void main(String[] args) { // 需求:希望如果不写学校默认就是”张三“! Student s1 = new Student("天蓬元帅", 1000 ); Student s2 = new Student("齐天大圣", 2000, "清华大学" ); } } class Study extends Student { public Study(String name, int age, String schoolName) { super(name , age , schoolName) ; // 根据参数匹配调用父类构造器 } } class Student{ private String name ; private int age ; private String schoolName ; public Student() { } public Student(String name , int age){ // 借用兄弟构造器的功能! this(name , age , "张三"); } public Student(String name, int age, String schoolName) { this.name = name; this.age = age; this.schoolName = schoolName; } // .......get + set }
final 用于修饰:类,方法,变量
面试题:final 和 abstract 的关系是互斥关系,不能同时修饰类或者同时修饰方法!
final 修饰静态成员变量,变量变成了常量
常量:有 public static final 修饰,名称字母全部大写,多个单词用下划线连接。
final 修饰静态成员变量可以在哪些地方赋值:
定义的时候赋值一次
可以在静态代码块中赋值一次
public class FinalDemo { //常量:public static final修饰,名称字母全部大写,下划线连接。 public static final String SCHOOL_NAME = "张三" ; public static final String SCHOOL_NAME1; static{ //SCHOOL_NAME = "java";//报错 SCHOOL_NAME1 = "张三1"; //SCHOOL_NAME1 = "张三2"; // 报错,第二次赋值! } }
final 修饰变量的总规则:有且仅能被赋值一次
final 修饰实例成员变量可以在哪些地方赋值 1 次:
public class FinalDemo { private final String name = "张三" ; private final String name1; private final String name2; { // 可以在实例代码块中赋值一次。 name1 = "张三1"; } //构造器赋值一次 public FinalDemo(){ name2 = "张三2"; } public FinalDemo(String a){ name2 = "张三2"; } public static void main(String[] args) { FinalDemo f1 = new FinalDemo(); //f1.name = "张三1"; // 第二次赋值 报错! } }