作业:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。
多数元素是指在数组中出现次数 大于 n/2 的元素。
[1,1,1,1,2,3,3]
public class Import {
public static void main(String[] args) {
int[] arr = {1, 1, 1, 1, 2, 3, 3};
System.out.println(howe(arr));
}
public static int howe(int[] nums) {
int left=0;
int right=1;
int count=1;
while (left<right&&right<nums.length){
if (nums[left]==nums[right]){
count++;
if (count> nums.length/2){
return nums[right];
}
}
left++;right++;
}
return 0;
}
}
作业:综合案例(用户博客管理系统):
public class user {
private String name;
private int age;
private String text;
public user(String name, int age, Strin
this.name = name;
this.age = age;
this.text = text;
}
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 String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
import java.util.*;
public class Test<use, pwd> {
static List list=new ArrayList();
static String[] use={"123","456","","",""};
static String[] pwd={"admin","user","","",""};
static boolean flag=false;
public static void main(String[] args) {
begin();
}
public static void begin() {
System.out.println("========欢迎进入用户管理系统=======");
System.out.println("请输入:1.登录 2.注册 3.发布博客 4.删除博客 5.修改博客 6.查看博客");
Scanner iu = new Scanner(System.in);
int n = iu.nextInt();
if (n == 1) {
Login();
begin();
} else if (n == 2) {
Registration();
begin();
} else if (n == 3) {
Add();
begin();
} else if (n == 4) {
Delete();
begin();
} else if (n == 5) {
Alter();
begin();
}else if (n==6){
Look();
begin();
}
else {
System.out.println("退出成功");
System.exit(0);
}
}
public static void Login() { //登录
Scanner iu = new Scanner(System.in);
System.out.print("请输入用户名:");
String a = iu.next();
System.out.print("请输入密码:");
String b = iu.next();
for (int i = 0; i < use.length; i++) {
if (a.equals(use[i]) && b.equals(pwd[i])) {
flag = true;
break;
}
}
if (flag){
System.out.println("登录成功");
}else {
System.out.println("登陆失败");
}
}
public static void Registration(){ //注册
int left=0;
int right=0;
Scanner iu=new Scanner(System.in);
System.out.print("请输入用户名:");
String a=iu.next();
System.out.print("请输入密码:");
String b=iu.next();
use[left+2]=a;
pwd[right+2]=b;
System.out.println("密码注册成功!!");
left++;right++;
System.out.println(Arrays.toString(use));
System.out.println(Arrays.toString(pwd));
}
public static void Add(){ //发布博客
Scanner iu=new Scanner(System.in);
System.out.println("请输入博客名字:");
String a=iu.next();
System.out.println("请输入博客类型:");
String b=iu.next();
System.out.println("请输入博客内容:");
String c=iu.next();
list.add(new user(a,b,c));
System.out.println("添加成功!!");
}
public static void Delete(){ //删除博客
boolean flag=false;
Scanner iu=new Scanner(System.in);
System.out.println("请输入博客的名字:");
String a=iu.next();
for (int i=0;i< list.size();i++){
if (a.equals(list.get(i))){
Iterator it= list.iterator();
while (it.hasNext()){
list.remove(it.next());
}
flag=true;
break;
}
}
if (flag){
System.out.println("删除成功");
}else {
System.out.println("集合中没有该元素,未删除成功");
}
}
public static void Alter(){ //修改博客
}
public static void Look(){
System.out.println("名字 类型 内容");
for (int i=0;i< list.size();i++){
System.out.println(list.get(i));
}
}
}
Team8(抽象类)
定义一个抽象的"Role"类 有姓名 年龄 性别等成员变量
1. 要求尽可能隐藏所有变量(能够私有就私有,能够保护就不要公有)
再通过GetXXX()和SetXXX()方法对各变量进行读写。具有一个抽象的play()方法
该方法不返回任何值 同时至少定义两个构造方法。Role类中要体现出this的几种用法。
2. 从Role类派生出一个"Employee"类 该类具有Role类的所有成员
构造方法除外 并扩展 salary成员变量 同时增加一个静态成员变量“职工编号 ID ”。
同样要有至少两个构造方法 要体现出this和super的几种用法
还要求覆盖play()方法 并提供一个final sing()方法。
3. "Manager"类继承"Employee"类 有一个final成员变量"vehicle"
4. 在main()方法中制造Manager和Employee对象,并测试这些对象的方法
abstract class Role {
private String name;
private int age;
private char sex;
public Role(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public Role(){}
public abstract void play();
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
public class Employee extends Role{ //派生类Employee
private double salary;
private int ID;
public Employee(String name,int age,char sex,double salary){
super(name,age,sex);
this.salary=salary;
}
@Override
public void play() {
System.out.println("真的很厉害啊");
}
public final void sing(){
System.out.println("这个方法已经被锁定,无法改变");
}
}
public class Manager extends Employee{
private final String vehicle;
public Manager(String name, int age, char sex, double salary, String vehicle) {
super(name, age, sex, salary);
this.vehicle = vehicle;
}
public static void main(String[] args) {
Manager m=new Manager("1",12,'女',100,"牛");
Employee e=new Employee("2",13,'男',100);
e.play();
e.sing();
m.play();
m.sing();
}
}
Team9(抽象类)
品尝饮料
1、建立一个Java抽象类Drink 应当 a、声明一个抽象方法taste() 该方法负责输出饮料的味道 b、声明int型常量来代表不同的饮料类型 咖啡、啤酒、牛奶 如 c、声明静态工厂方法getDrink(int drinkType) 根据传入的参数创建不同的饮料对象 并返回该对象 建议使用switch语句。该方法要求声明DrinkNotFoundException 当没有相对应的饮料类型时 抛出该异常。
public abstract class Drink {
public abstract void taste();
static int a = 1;//咖啡
static int b = 2;//啤酒
static int c = 3;//牛奶
public static String getDrink(int drinkType) throws DrinkNotFoundException {
try {
switch (drinkType) {
case 1:
return "a";
case 2:
return "b";
case 3:
return "c";
default:
throw new DrinkNotFoundException();
}
} catch (Exception e) {
return "没有该饮料";
}
}
private static class DrinkNotFoundException extends Exception {
}
public static void main(String[] args) throws DrinkNotFoundException {
System.out.println(getDrink(5));
}
}
2、建立Drink的具体子类 a、分别建立Drink的子类 Coffee 代表咖啡 Beer 代表啤酒 Milk 代表牛奶 ; b、实现taste()方法 要求在控制台打印各自的味道特征。
public class Coffee extends Drink{
public void taste(){
System.out.println("咖啡的味道很苦");
}
}
public class Beer extends Drink{
public void taste(){
System.out.println("啤酒的味道有点苦");
}
}
public class Milk extends Drink{
public void taste(){
System.out.println("牛奶的味道很纯");
}
}
3、建立异常类DrinkNotFoundException a、继承Exception b、在Drink的 方 法getDrink(int drinkType)中 声 明 引 发DrinkNotFoundException异常 当传入的参数没有相对应的饮料类型时 抛出异常。 c、在使用getDrink方法的类中捕捉该异常。
public static String getDrink(int drinkType) throws DrinkNotFoundException {
try {
switch (drinkType) {
case 1:
return "a";
case 2:
return "b";
case 3:
return "c";
default:
throw new DrinkNotFoundException();
}
} catch (Exception e) {
return "没有该饮料";
}
}
public static void main(String[] args) throws DrinkNotFoundException {
System.out.println(getDrink(5));
}
4、建立Test测试类 测试以上内容的正确性 a、编写main方法 通过命令行传参的方式传入某种饮料的类型。 b、在main方法中 调用Drink类的getDrink方法 获得相应的饮料对象。注意捕获DrinkNotFoundException。 c、然后调用该饮料对象的taste()方法 输出该饮料的味道。
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws DrinkNotFoundException {
Coffee coffee=new Coffee();
Beer beer=new Beer();
Milk milk=new Milk();
Scanner iu=new Scanner(System.in);
int d=iu.nextInt();
System.out.println(Drink.getDrink(d));
if (d==1){
coffee.taste();
}
if (d==2){
beer.taste();
}
if (d==3){
milk.taste();
}
}
}
5、编译程序 并运行。
注意事项 1、仔细审题 把题目要求理解准确 2、请注意多态性的运用 3、请注意代码的书写、命名符合规范 应有适当的注释
输出结果:
3
c是牛奶
牛奶的味道很纯
内部类、static关键字、final
1.什么是内部类:内部类,指的就是定义在某个类内部的类。
如何定义内部类:
class outer{
class inter{ //定义一个内部类
private String name=" "; //定义一个内部变量
}
}
有哪些访问修饰符可以使用在内部类
public、default(包访问权限)、private、protected、static、final可以用在内部类上 ,局部内部类上不能有修饰符,或者只能有个final修饰符
如何在外界访问对象
public class Ce {
static class In{ //内部类
public String name="howe";
public static void wu(){
System.out.println("你好牛啊!!!");
}
}
public static void main(String[] args) { //在外界访问内部对象
In a=new In(); //创建一个内部对象,调用内部方法
System.out.println(a.name);
a.wu();
}
}
2.static关键字
在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。
用途:方便在没有创建对象的情况下进行调用(方法/变量),static可以用来修饰类的成员方法、类的成员变量
3.final关键字
final关键字代表最终,不可被改变的
1. 可以用来修饰一个类
2. 可以用来修饰一个方法
3. 还可以用来修饰一个局部变量
4. 还可以用来修饰一个成员变量
(1)、当final修饰类时,当前这个类不能有任何子类,无法进行重写和覆盖
(2)、当final修饰方法时,这个方法就是最终方法,也就是不能被覆盖重写
(3)、当final修饰变量时,那么这个变量就无法进行改变
接口和抽象
Java接口:在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口与类相似点:
- 一个接口可以有多个方法。
- 接口文件保存在 .java 结尾的文件中,文件名使用接口名。
- 接口的字节码文件保存在 .class 结尾的文件中。
- 接口相应的字节码文件必须在与包名称相匹配的目录结构中。
接口与类的区别:
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法,Java 8 之后 接口中可以使用 default 关键字修饰的非抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
public interface JieKou { //接口的声明
}
接口的实现
当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
接口语法:....implements 接口名称[,其他接口名称,其他接口名称...]
public class MammalInt implements Animal{
public void eat(){
System.out.println("吃东西");
}
}
接口的多继承
在Java中,类的多继承是不合法,但接口允许多继承。
public interface Hockey extends Sports, Event //接口多继承
Java抽象类
抽象类的概念:在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类的使用:
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。
public abstract class Lei { //定义抽象类
}
public abstract class Wang extend Lei{ //继承抽象类
}
抽象方法:Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
public abstract class Employee
{
private String name;
private String address;
private int number;
public abstract double computePay();
}
声明抽象方法会造成以下两个结果:
- 如果一个类包含抽象方法,那么该类必须是抽象类。
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。
面向对象的三大特征
Java的继承、封装、多态
类的继承
class 父类 {
}
class 子类 extends 父类 {
}
public class Mouse extends Animal{
}
继承的特性
子类拥有父类非 private 的属性、方法。
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
子类可以用自己的方式实现父类的方法。
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
注意:Java不支持多继承,但支持多重继承
单继承:Class A--->Class B
多重继承:Class A--->Classs B--->Class C
不同类继承同一个类:Class A--->Class C Class B--->Class C
一个类不能同时继承多个类
super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}
输出结果为:
animal : eat
dog : eat
animal : eat
final 关键字
final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。
final 含义为 "最终的"。
使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写:
声明类:
final class 类名 {//类体}
声明方法:
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
构造器
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
Java 封装
封装的优点
1. 良好的封装能够减少耦合。
2. 类内部的结构可以自由修改。
3. 可以对成员变量进行更精确的控制。
4. 隐藏信息,实现细节。
public class Person{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public void setName(String name){
this.name = name;
}
}
name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。
对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问。
Java 多态
多态是同一个行为具有多个不同表现形式或形态的能力,多态就是同一个接口,使用不同的实例而执行不同操作。
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
class Shape {
void draw() {}
}
class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
}
class Square extends Shape {
void draw() {
System.out.println("Square.draw()");
}
}
}