java
的核心思想就是面向对象(Object-Oriented Programming,OOP)
public class Hello {
public static void main(String[] args) {
}
/*
修饰符 返回值类型 方法名(..){方法体}
*/
// return 结束方法,返回一个结果
// break只结束循环,后面语句可以继续执行
public String sayHello() {
return "Hello,world";
}
public void hello() {
return;
}
public int max(int a, int b) {
return a > b ? a : b; //三元运算符
}
}
package Demo;
// 学生类
public class Student {
// 非静态方法
public void say() {
System.out.println("学生说话了");
}
}
package Demo;
public class Demo01 {
public static void main(String[] args) {
// 实例化要调用的类
// 对象类型 对象名=对象值;
Student student = new Student();
student.say();
}
}
package Demo;
public class Demo01 {
// 以下这种情况,b可以调用a,但a不可以调用b
// 静态方法static和类一起加载
public static void a() {
}
// 非静态方法需要在类实例化(new)之后才存在
public void b() {
}
}
package Demo;
// 值传递
// java都是值传递
public class Demo01 {
public static void main(String[] args) {
int a = 1;
System.out.println(a);
Demo01 demo = new Demo01();
demo.change(a);
System.out.println(a);
}
// 未返回任何值
public void change(int a) {
a = 10;
}
}
package Demo;
// 引用传递,操作的是对象,本质还是值传递
public class Demo01 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
Demo01 demo = new Demo01();
demo.change(person);
System.out.println(person.name);
}
// 未返回任何值
public void change(Person person) {
// person是一个对象,而不是形参,person对象指向Person person = new Person();这是一个具体的人,可以改变名字(属性)
person.name = "我的名字";
}
}
// 一个类中只能有一个public类
// 定义一个Person类,有一个属性:name
class Person {
String name; // 默认值为null
}
使用new
关键字创建对象
使用new
关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及类中的构造器的调用
类的构造器也称为构造方法,是在进行创建对象的时候必须要调用,并且构造器有以下两个特点
必须和类的名字相同
必须没有返回类型,也不能写void
构造器必须要掌握
package Demo;
// 学生类,一个类里面只能有属性和方法两种东西
public class Student {
// 属性
String name;
int age;
// 方法
// this指的是当前类
public void study() {
System.out.println(this.name + "在学习");
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
// 类,抽象的,实例化
// 类实例化后会返回一个自己的对象
// student对象就是Student类的具体实例
Student student1 = new Student();
Student student2 = new Student();
student1.name = "xiaoming";
student1.age = 2;
student2.name = "xiaohong";
student2.age = 2;
System.out.println(student1.name);
System.out.println(student2.age);
}
}
一个类即使什么都不写,依然可以new
实例化,因为会自动存在一个构造方法
类的构造器也称为构造方法,是在进行创建对象的时候必须要调用,并且构造器有以下两个特点
必须和类的名字相同
必须没有返回类型,也不能写void
// 例如一个这样的类
class Student {}
// 编译后会变成如下样子,会自动添加一个方法
// 这被称为无参构造器,可以帮忙初始化一些东西
class Student {
// 实例化初始值
public Student(){
}
}
package Demo;
// 学生类,一个类里面只能有属性和方法两种东西
public class Student {
// 属性
String name;
int age;
// 构造器.不写会自动生成,这里手写一下,同时初始化一下值
public Student() {
this.name = "你的名字";
}
// 方法
// this指的是当前类
public void study() {
System.out.println(this.name + "在学习");
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Student student1 = new Student();
System.out.println(student1.name);
}
}
new
关键字,必须要有构造器,因为本质是在调用构造器alt+insert
可以快捷地生成构造器package Demo;
// 学生类,一个类里面只能有属性和方法两种东西
public class Student {
// 属性
String name;
int age;
// 构造器.不写会自动生成,这里手写一下,同时初始化一下值
public Student() {
this.name = "你的名字";
}
// 有参构造一旦定义了有参构造,无参构造就必须显式定义
public Student(String name) {
this.name = name;
}
// 方法
// this指的是当前类
public void study() {
System.out.println(this.name + "在学习");
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Student student1 = new Student("xueyan");
System.out.println(student1.name);
}
}
java
程序运行时主要分以下几步
static
静态方法(因为static
与类一起加载,所以之后类中可以直接调用)main
方法放到栈底,因为栈是先进后出,当main
方法出栈的时候可以基本理解为程序运行结束field
=成员变量(对象当中只有引用和方法),属性会进行默认初始化
修饰符 属性类型 属性名=属性值
new
关键字创建,必须具有构造器(构造器不写编译器会默认生成)封装:简单理解就像人把东西放在箱子中,要拿东西只能通过固定的口去拿出来
该露的露,该藏的藏
封装(数据的隐藏)
记住这句话:属性私有,get/set
封装更多针对属性而言,方法用不到多少封装
方法重载,方法名称一致,但输入值或者返回值类型不同,编译器会自动调用适合的方法
封装的好处
package Demo;
// 学生类,一个类里面只能有属性和方法两种东西
public class Student {
// 属性私有
private String name;
private int id;
private char sex;
private int age;
// 提供一些可以操作这个私有属性的方法
// 提供一些public的get/set方法
// get获取数据,set给数据设置值
// alt+insert可以自动生成get/set方法
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
// 通过封装,可以在输入值的时候进行属性判断
public void setAge(int age) {
if (age < 0 || age > 120) {
age = 3;
this.age = age;
} else {
this.age = age;
}
}
public int getAge() {
return this.age;
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.setName("你的名字"); // 设置名字
System.out.println(student.getName()); // 获取名字
student.setAge(140);
System.out.println(student.getAge());
}
}
extends
表示
extends
的意思是扩展,子类是父类的扩展java
中只有单继承,没有多继承,即一个类只能继承单个类,例如基因上说,儿子只能有一个爸爸,一个爸爸却可以有多个儿子object
:在java
中,所有类都直接或者间接继承Object
类package Demo;
// 在java中,所有类都直接或者间接继承`Object`类
public class Person {
private int money = 10_0000_0000;
public void say() {
System.out.println("人说了一句话");
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
package Demo;
// 子类继承父类,就会拥有父类的属性和全部方法
// 注意,如果父类使用了private修饰符,则子类就无法继承,一般属性都是私有的,公共的都是方法
public class Student extends Person {}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.say(); // say方法在Student中没有定义,但仍然可以调用父类
System.out.println(student.getMoney());
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Student student = new Student();
student.test("名字");
}
}
package Demo;
// 在java中,所有类都直接或者间接继承`Object`类
public class Person {
public Person(String name) {
System.out.println("Person无参执行了");
}
protected String name = "xueyan";
}
package Demo;
// 子类继承父类,就会拥有父类的属性和全部方法
// 注意,如果父类使用了private修饰符,则子类就无法继承,一般属性都是私有的,公共的都是方法
public class Student extends Person {
private String name = "狂神";
// 执行子类构造器时,会先执行父类的构造器
public Student(){
// 隐藏代码,调用了父类的构造器
super("name"); // 显式调用时,必须在第一行
System.out.println("Student无参执行了");
}
// super代表调用父类方法,但如果父类中方法为private,则不能用super调用
public void test(String name) {
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
super
注意点:
super
调用父类的构造方法,必须在构造方法第一个super
必须只能出现在子类的方法或者构造方法中super
和this
不能同时调用构造方法super
和this
区别
super
代表父类对象应用this
本身调用的对象this
没有继承也可以使用super
只有在继承情况下才可以使用this()
:本类的构造器super()
:父类的构造器重写都是方法的重写,与属性无关
重写只发生在父子类之间
重写只跟非静态公开方法有关,与静态方法没关系
使用静态方法时
package Demo;
// 重写都是方法的重写,与属性无关
public class A {
public static void test() {
System.out.println("A=>test()");
}
}
package Demo;
public class B extends A {
public static void test() {
System.out.println("B=>test()");
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
B b = new B();
b.test();
// 父类的引用指向了子类,实际上调用了B继承的父类A
// 在静态方法时,方法的调用只和等号左边定义的数据类型有关
A a = new B();
a.test();
}
}
不使用静态方法时
package Demo;
// 重写都是方法的重写,与属性无关
public class A {
public void test() {
System.out.println("A=>test()");
}
}
package Demo;
public class B extends A {
// 重写
@Override // 注解:有功能的注释
public void test() {
System.out.println("B=>test()");
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
B b = new B();
b.test();
// 父类的引用指向了子类,实际上调用了B继承的父类A
// 在静态方法时,方法的调用只和等号左边定义的数据类型有关
// 非静态方法时,父子类相同名称函数发生的就是重写
A a = new B();
a.test();
}
}
重写总结:类之间必须有继承关系,子类重写父类的方法
方法名必须相同
参数列表必须相同
修饰符:范围可以扩大但不能缩小(子类修饰符范围可以大于父类修饰符的范围)
public>protected>default>private
抛出的异常:范围可以被缩小,但不能扩大(子类的异常范围必须小于父类的异常范围)
子类的方法必须要和傅雷一直,但方法体不同
为什么需要重写
alt+insert
package Demo;
// 在java中,所有类都直接或者间接继承`Object`类
public class Person {
public void run() {
System.out.println("run");
}
}
package Demo;
// 子类继承父类,就会拥有父类的属性和全部方法
// 注意,如果父类使用了private修饰符,则子类就无法继承,一般属性都是私有的,公共的都是方法
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void eat() {
System.out.println("eat");
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
// 一个对象的实际类型是确定的,但可以指向的引用类型不确定
// Student能调用的方法都是自己的或者继承父类的
Student s1 = new Student();
// 下面被称为父类的引用指向子类的类型,实际类型是student,引用的是person
// 可以直观理解为,学生是人,同时亦是学生,一个人可以有多重身份
Person p1 = new Student();
// Person父类型,可以指向子类,但不能调用子类独有的方法
Object o1 = new Student();
// 父类的引用指向子类的类型,能执行什么方法其实取决于等号左边的引用类型
s1.run(); // 当子类重写了父类的方法,执行的是子类的方法
p1.run();
s1.eat();
p1.eat(); // 当引用的父类没有相关方法时,无法执行
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
// 一个对象的实际类型是确定的,但可以指向的引用类型不确定
Student s1 = new Student();
// 下面被称为父类的引用指向子类的类型,实际类型是student,引用的是person
// 可以直观理解为,学生是人,同时亦是学生,一个人可以有多重身份
Person p1 = new Student();
Object o1 = new Student();
// 父类的引用指向子类的类型,能执行什么方法其实取决于等号左边的引用类型
s1.run(); // 当子类重写了父类的方法,执行的是子类的方法
p1.run();
((Student) p1).eat(); // 将类型强制转换为Student后可以调用
}
}
多态注意事项
多态是方法的多态,属性没有多态
父类和子类,类之间必须有联系,错误的会报类型转换异常
存在条件:类之间存在继承关系,方法需要被重写,同时父类引用指向子类对象
Father f = new Son()
有几种情况无法被重写
static
方法,静态方法属于类,不属于实例final
定义的是常量private
私有方法instanceof
判断类型是否一致
多态:父类引用指向子类的对象
把子类转换为父类,叫做向上转型,不用强制转换
把父类转换为子类,称作向下转换,需要强转换
作用在于调用的时候把对象升级或者降级一下就可以调用,方便方法的调用,减少重复代码
package Demo;
// 在java中,所有类都直接或者间接继承`Object`类
public class Person {
public void run() {
System.out.println("run");
}
}
package Demo;
public class Teacher extends Person {
}
package Demo;
// 子类继承父类,就会拥有父类的属性和全部方法
// 注意,如果父类使用了private修饰符,则子类就无法继承,一般属性都是私有的,公共的都是方法
public class Student extends Person {
@Override
public void run() {
System.out.println("son");
}
public void eat() {
System.out.println("eat");
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
// 一个对象的实际类型是确定的,但可以指向的引用类型不确定
Object object = new Student();
System.out.println(object instanceof Student);
System.out.println(object instanceof Person);
System.out.println(object instanceof Object);
System.out.println(object instanceof Teacher);
System.out.println(object instanceof String);
System.out.println("========================");
Person person = new Student();
System.out.println(person instanceof Student);
System.out.println(person instanceof Person);
System.out.println(person instanceof Object);
System.out.println(person instanceof Teacher);
// System.out.println(object instanceof String); 编译报错,同级指标不能互相转换
// 多态的操作实际上某种意义上进行了类型的轻质转换,从低类型转换为了高类型
// 子类转换为父类可能会丢失一些方法
Person p1 = new Student();
((Student)p1).eat();
}
}
static
修饰的变量,此类变量支持对象调用,且支持通过类名调用,也被称作类变量.当一个变量需要被很多类调用的时候可以使用package Demo;
// 一个项目应该只存在一个main方法
public class Application {
private static int age;
private double score;
public static void main(String[] args) {
Application application = new Application();
System.out.println(Application.age); // 通过类的方式调用
System.out.println(application.age); //通过对象调用
go(); //静态对象与类一起加载,直接调用
}
public static void go() {
System.out.println("go");
}
}
在java
的类主体代码当中可以用{}
来表示匿名代码块
package Demo;
// 静态导入包
import static java.lang.Math;
// 一个项目应该只存在一个main方法
public class Application {
// 匿名代码块意味着可以用来进行一些初始赋值,初始化
{
System.out.println("匿名代码块");
}
// 静态代码块只执行一次,只有第一次执行
static {
System.out.println("静态代码块");
}
public Application() {
System.out.println("构造函数");
}
public static void main(String[] args) {
Application application1 = new Application();
System.out.println("============");
Application application2 = new Application();
System.out.println(Math.random());
}
}
通过final
修饰的类不能被继承
abstract
修饰符可以用来修饰方法也可以修饰类,修饰方法,该方法就是抽象方法;修饰类,就是休市内new
关键字来创建对象,主要是用来让子类继承的package Demo;
// abstract用于标识抽象类,该抽象类是寄希望于有人根据自己需要进行实现,抽象类主要起约束作用
public abstract class Person {
// 抽象方法(只有方法名),具体功能别人实现,这里主要起到约束作用
public abstract void doSomething();
}
package Demo;
// 抽象类的所有方法,继承了它的子类,都必须要实现相应方法,除非这个子类也是抽象类
// java类只允许继承一个类,即单继承
public class Teacher extends Person {
@Override
public void doSomething() {
System.out.println("do it now");
}
}
class
,声明接口的关键词interface
package Demo;
// 接口都需要有实现类
public interface UserService {
// 接口的所有定义都默认是抽象的,public abstract这个可以默认不写
void add(String name);
void delete(String name);
void update(String name);
void query(String name);
}
package Demo;
public interface TimeService {
void timer();
}
package Demo;
// 实现类的命名规范 类+实现类名称+implements+接口名称
// 实现了接口的类,就需要重写接口的方法,利用接口实现多继承(实际是实现)
public class UserInterfaceImpl 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() {
}
}
public abstract
public static final
implements
可以实现多个接口,变相实现了多继承内部类就是在一个类的内部定义一个类.比如,A类中定义一个B类,那么B类相对A类来说就被称为内部类,而A类相对B类来说就是外部类
以下几种类型
成员内部类
package Demo;
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() {
System.out.println(id);
}
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Outer outer = new Outer();
outer.out();
// 通过外部类实例化内部类
Outer.Inner inner = outer.new Inner();
inner.in();
inner.getID();;
}
}
静态内部类
package Demo;
public class Outer {
private int id = 10;
public void out() {
System.out.println("这是外部类的方法");
}
// 静态内部类,此时无法获取非静态的属性
public static class Inner {
public void in() {
System.out.println("这是内部类的方法");
}
}
}
局部内部类
package Demo;
// 一个java文件中可以有多个class类,但只能有一个public class
public class Outer {
private int id = 10;
public void method() {
// 局部内部类
class Inner {
public void in() {
}
}
}
}
匿名内部类
package Demo;
// 一个java文件中可以有多个class类,但只能有一个public class
public class Outer {
private int id = 10;
public void method() {
// 局部内部类
class Inner {
public void in() {
}
}
}
}
package Demo;
// 一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
// 没有名字初始化类,匿名内部类,不用将实例保存到对象中
// 接口也一样
new Outer().method();
}
}
原文:https://www.cnblogs.com/hanxueyan/p/14811468.html